home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48hor2 / suite3d.doc < prev    next >
Text File  |  1995-03-31  |  21KB  |  477 lines

  1. (Comp.sources.hp48) Main: r 
  2.   Subj: v03i003:  suite3d - 3d Graphing Suite v3.0, Part01/02 
  3. Author: [Charles Patton] 
  4. Item: 23 by charliep at hpcvrs.cv.hp.com 
  5.   Date: Mon Dec 02 1991 17:28  
  6.  
  7. @ Version 3.0 @ 
  8.  
  9. _Introduction_ 
  10.  
  11.      The programs contained in this document comprise a suite of 3D 
  12. graphing/viewing utilities for the HP-48 (an HP-28 version will be 
  13. forthcoming provided sufficient interest.) 
  14.  
  15.      We had several requirements to consider in creating these 
  16. programs. Our aims were that they be (1) purely user code, (2) 
  17. relatively short, and (3) psychologically effective.  Aims (1) and (2) 
  18. are due to our target audience of educators, many of whom have little 
  19. contact with technology beyond their use of the HP-48 or HP-28. We 
  20. expect that, in many situations, one user will obtain the code in 
  21. printed form, enter it into their machine, and transmit it to others 
  22. via the infrared I/O. 
  23.  
  24.      In exploring visualization techniques on a variety of machines we 
  25. found that increasing "realism" (read: ray-traced, Phong-shaded, 
  26. hidden-line, etc.) in the graphical presentation of functions of two 
  27. variables did not necessarily correlate with increasing ease of 
  28. comprehension. These programs represent the results of some of these 
  29. experiments (including time-to-completion as an important factor). 
  30.  
  31.      We invite you to try them out and experiment yourself. All 
  32. suggestions, additions, corrections, insights, commentary, and 
  33. criticisms are welcome. 
  34.  
  35. _Suite3D Version 3.0 Additions and Changes_ 
  36.  
  37. Version 3.0 adds one new feature, GRIDMAP, which presents a method 
  38. of visualizing maps from the plane to the plane. The idea is simple: 
  39. draw the image under the mapping function of a rectilinear grid residing 
  40. in the input plane. Besides being used in various graphing programs, such 
  41. as 'f(z)' by Lascoux Graphics, it has been shown to be an effective aid 
  42. in understanding iterated maps of the plane (see "Grid Imaging for a Two- 
  43. Dimensional Map," Judd, Mees, Aihara, and Toyada, _International Journal 
  44. of Bifurcation and Chaos_, V1 N1, March 1991.) 
  45.  
  46. As usual, POSTSCRIPT output capabilites for this plotting method are 
  47. included and, as usual, you can leave them out if you are short on 
  48. room. 
  49.  
  50. _Suite3D Version 2.0 Additions and Changes_ 
  51.  
  52. In addition to the slopefield, pseudo-contour, oblique perspective, 
  53. Phong-Shaded, and movie plotting capabilities, version 2.0 introduces 
  54.  
  55. *Major Feature*  POSTSCRIPT(TM) output for all the graphing routines in a 
  56. form suitable for editing/viewing with Adobe Illustrator(TM), sending to a 
  57. POSTSCRIPT printer, or including in a \special {\illustration} TeX(TM) 
  58. command. Included is a PS-output version of the standard DRAW command. 
  59.  
  60. All the output is in terms of line segments, Bezier curves, and fill- 
  61. regions so that it can be scaled to arbitrary size or printed at 
  62. very high resolution without loss of smoothness. 
  63.  
  64. If you have ever wanted to produce high-quality function-graph illustrations 
  65. with the flexibility that '48 provides, this is for you! (You might be able 
  66. to tell that I'm pretty happy with this item.) 
  67.  
  68. *Significant Addition* (relatively) fast WIREFRAME graphing in oblique 
  69. 3D perspective with adjustable grid spacing. 
  70.  
  71. *Easier View Switching* The 3D plotting parameters have been rearranged 
  72. so that all the routines can compute an appropriate XRNG and YRNG from 
  73. these. Once set, you can go from view to view with no manual adjustments. 
  74.  
  75. *Other Enhancements* 
  76.    A Movie single-step has been added so that you can easily step through a 
  77.    Movie frame-by-frame. 
  78.  
  79.    All routines now use user-specified number of X-increments and 
  80. Y-increments, 
  81.    as appropriate, so that the WIREFRAME grid, the lattice of slopefield 
  82.    segements, and number of Movie frames, etc. all references these numbers 
  83.    rather than being "hard coded" as in the earlier versions. 
  84.  
  85. _NO WARRANTY_ 
  86.     This work is provided on an "as is" basis. Hewlett-Packard Co. 
  87. provides no warranty whatsoever, either express or implied regarding 
  88. the work, including warranties with respect to its merchantability or 
  89. fitness for any purpose whatsoever. 
  90.  
  91. _Copyright_ 
  92.    Copyright (C), 1991, Hewlett-Packard Co. Permission to copy all or 
  93. part of this work is granted provided that the copies are not made or 
  94. distributed for resale (excepting nominal copying fees) and the 
  95.  _NO WARRANTY_ and this copyright notice are included verbatim. Other 
  96. permissions can be arranged by contacting the author. 
  97.  
  98. _Correspondence_ 
  99.  
  100. Correspondence on Suite3D suite should be sent to Charles Patton at one of the 
  101. following addresses: 
  102.  
  103. snail-mail: 
  104.           M.S. 5U-L9 
  105.           Hewlett-Packard Co. 
  106.           1000 N.E. Circle Blvd. 
  107.           Corvallis, OR 97330 
  108.  
  109. e-mail: 
  110.           charliep@cv.hp.com    (for Internet hosts) 
  111.           hplabs!hpcvrs!charliep (for UUCP hosts) 
  112.  
  113. _Organization_ 
  114.  
  115.      Analogous to the built-in plotting routines, all the Suite3D 
  116. programs assume that the function of interest is stored in EQ. 
  117. Further, they assume that the function is represented as an expression 
  118. in the variables 'X' and 'Y' (e.g. u,v -> sin(u+v) is represented as 
  119. 'SIN(X+Y)' in EQ).  
  120.  
  121. N.B.> Insure that 'X' and 'Y' are formal (no variables 'X' and 'Y'  
  122. N.B.> along the current path). 
  123.  
  124. N.B.> Most of these routines produce their best-looking output with the 
  125. N.B.> machine in "CONNECT" mode ( the CNCT button in the MODES menu  
  126. N.B.> toggles this mode.)  
  127.  
  128. N.B.> While you are examining the MODES menu, be sure to check that the  
  129. N.B.> the machine is in SYMBOLIC EVALUATION mode ( SYM button.) 
  130.  
  131.      The viewing region and other Suite3D plotting parameters are stored 
  132. in the sub-directory, VPAR. VPAR contains the variables: 
  133.     Xleft and Xright, 
  134.        controlling the width of the view-volume, 
  135.     Yfar and Ynear, 
  136.        controlling the depth of the view-volume, 
  137.     Zlow and Zhigh, 
  138.        controlling the height of the view volume, 
  139.     XXleft and XXright, 
  140.        controlling the horizontal range of the GRIDMAP 
  141.        output plane, 
  142.     YYlow and YYhigh, 
  143.        controlling the vertical range of the GRIDMAP 
  144.        output plane, 
  145.     Xe, Ye, and Ze, 
  146.        the coordinates of the eye-point, 
  147.     Nx and Ny, 
  148.        the number of X- and Y-increments desired, and 
  149.     hidden 
  150.        the flag indicating that hidden-line plotting should be used 
  151.        in the Yview plotter. 
  152.  
  153.       VPAR was implemented as a sub-directory so that the REVIEW key can be 
  154. used to examine the state of these variables in a way which reminds 
  155. the user of their meaning. 
  156.  
  157.      Other than VPAR, the programs here are organized into a single 
  158. directory for convenience.  Inter-dependence of the programs and other 
  159. variables is noted in the program description. 
  160.  
  161. _Oversized PICTs_ 
  162.  
  163.      All of the programs seem to work reasonably well with arbitrary sized 
  164. PICT grobs. However, ShapeToShade only draws to the upper-left-hand-corner 
  165. of the grob, and Movie only shows the display-sized region of the grob (what 
  166. else could it do?) The POSTSCRIPT plotting routines scale their results to 
  167. the size of the default PICT grob, but this should pose few problems. 
  168.  
  169. _Descriptions of the Programs_ 
  170.  
  171. SlopeField: 
  172.      The SlopeField program plots a lattice of line segments whose 
  173. slopes represent the function value at their centerpoint. Using 
  174. SlopeField to plot F(X,Y) allows your eye to pick out integral curves 
  175. of the differential equation dy/dx=F(x,y). It is quite useful in 
  176. understanding where the "arbitrary constant" in anti-derivatives comes 
  177. from. 
  178.  
  179. The number of lattice points per row is determined by Nx and the 
  180. number of lattice points per column is determined by Ny. The input region 
  181. sampled is given by Xleft < X < Xright and Ynear < Y < Yfar. 
  182.  
  183. psContour: 
  184.      The psContour program (pseudo-contour) program uses SlopeField to 
  185. produce a fast contour plot of the current function. By plotting the 
  186. direction field perpendicular to the gradient of the function it 
  187. allows your eye to pick out the integral curves (contours) without 
  188. actually plotting them. The apparent contours are evenly spaced 
  189. visually and so give no information on how steep the graph is at any 
  190. particular point. 
  191.  
  192. The number of lattice points per row is determined by Nx and the 
  193. number of lattice points per column is determined by Ny. The input region 
  194. sampled is given by Xleft < X < Xright and Ynear < Y < Yfar. 
  195.  
  196. YView: 
  197.      The YView program provides an oblique-view, perspective, 3D 
  198. surface plot (viewing toward increasing Y). This produces a sequence of 
  199. plots of the function along Y=constant lines in the input domain. These 
  200. plots are perspective-projected onto the view-plane relative to the eye 
  201. point. In overhead view: 
  202.                                 Yfar 
  203.        +----------------+ 
  204.  .     |            |  . 
  205.        |            | 
  206.  Xleft |      /\    |Xright 
  207.     .  |     /  \       | . 
  208.      . |     .   .      |. 
  209.        +----------------+ 
  210.        .      .  .      . Ynear 
  211.           .      .       . 
  212.             .     . .    . 
  213.    ---------.----..---.--------------------- view-plane 
  214.                  .  .   . 
  215.                      . . . 
  216.                        *  eye-point (Xe,Ye,Ze) 
  217.              |<- XRNG ->| 
  218.  
  219.      The same picture holds with Zlow replacing Xleft, Zhigh replacing Xright, 
  220. and YRNG replacing XRNG (and turning your head 90 degrees to the right.) 
  221.  
  222.      In short, Ynear and Yfar and Ny determine the Y-inputs sampled;  
  223. Xleft, Xright, and the eye-point determine the XRNG; Zlow, Zhigh, 
  224. and the eye-point determine the YRNG. This computation is performed by 
  225. the utility, SetWindow. 
  226.  
  227.      This is a simple "divide-by-depth" method for perspective 
  228. plotting where the viewplane is always 1 unit from the viewpoint and 
  229. is parallel to the x-z plane. Since the perspective transformation in 
  230. the case can be implemented by a simple change of coordinates, 
  231. plotting individual sections is no slower than ordinary plots. 
  232.  
  233.      If 'hidden' is non-zero, each plot of a sampled point will erase the 
  234. column of pixels below it. Since the curves are plotted back-to-front, 
  235. this results in a hidden-line plot of the surface. It works best if 
  236. RES is #1 or #2 and connected-mode is on (CNCT.) 
  237.  
  238.      Note: To abort this routine, press the [ON] key and then press 
  239. the [ENTER] key. 
  240.  
  241. WIREFRAME: 
  242.      The WIREFRAME program plots an oblique-perspective view of a wire-frame 
  243. model of the surface with Nx vertices in each row and Ny vertices in each 
  244. column. It calls SetWindow to set the XRNG and YRNG and uses much the same 
  245. technique as Yview. The sampled region is determined by Xleft, Xright, Ynear, 
  246. and Yfar. 
  247.  
  248. ShapeToShade: 
  249.      The ShapeToShade program plots the function as a Phong-shaded 
  250. figure viewed from above with a light source from above, that 
  251. is, shaded according to the angle the tangent plane makes with the incident 
  252. light source. It assumes that the variable DPAR contains sixteen 4x4 GROBS 
  253. to serve as the dithering pattern. The dither patterns included are probably 
  254. not the best possible: insights along these lines are most welcome. The 
  255. variables Xleft, Xright, Yfar, and Ynear determine the inputs sampled. 
  256.  
  257. Movie: 
  258.      The Movie program plots Ny cross-sections of the function plot 
  259. varying the Y-value from Yfar to Ynear. The viewing window is determined 
  260. by Xleft, Xright, Zlow, and Zhigh. Having plotted these frames, it calls the  
  261. utility program, uSMOV (utility-show-movie), to play them  back in 
  262. repeated sequence.  
  263.  
  264.      Note: To abort this routine in the plotting phase, press the [ON] 
  265. key and then press the [ENTER] key.  To end the movie press any key 
  266. (e.g. [ENTER]). 
  267.  
  268. uSMOV: 
  269.      The uSMOV (utility show-movie) program takes an alternating sequence of  
  270. <n> grobs and <n> descriptors (with <2n> on the top of the stack) from the 
  271. stack and shows them in sequence, thus producing a movie effect. Stop 
  272. the show with any key press but [ON]. 
  273.  
  274. SSTMovie: 
  275.      After stopping Movie or uSMOV, you can use SSTMovie to step through 
  276. the sequence of movie frames. To show the next frame, press any key but 
  277. [ENTER] or [ON]. Press [ENTER] to quit. 
  278.  
  279. GRIDMAP: 
  280.      The GRIDMAP routine takes a complex valued function (stored in EQ 
  281. as a complex-valued expression in X and Y) and plots the image under 
  282. this map of a rectilinear grid with Nx columns and Ny rows which lives 
  283. in the region [Xleft,Xright]x[Ynear,Yfar]. The portion of the output 
  284. plane shown on the screen is [XXleft,XXright]x[YYlow,YYhigh]. These 
  285. are additional variables in VPAR. The trig and arc-trig functions 
  286. (e.g. 'SIN(X+i*Y)') give very interesting "starter" examples. 
  287.  
  288.      To get the image of a polar grid rather than a rectilinear grid, 
  289. precompose you function with the polar-to-rectangular coordinate 
  290. change: 
  291.   'SIN(X+i*Y)' {X 'X*COS(Y)' Y 'X*SIN(Y)'} | 
  292. => 'SIN(X*COS(Y)+i*X*SIN(Y))' 
  293.  
  294.      Setting 'Xleft' to 0 and 'Xright' to 1 then corresponds to 
  295. setting (the nonexistent) 'Rlow' to 0 and 'Rhigh' to 1. Similarly, 
  296. settign 'Ynear' to 0 and 'Yfar' to 2pi corresponds to setting the 
  297. angular range. 
  298.  
  299. SetWindow: 
  300.     This utility maps the view volume and eye-point coordinates into the 
  301. appropriate XRNG and YRNG values for perspective plotting (see the picture 
  302. in the YView description.) It also gets all the plotting parameters onto 
  303. the stack. 
  304.  
  305. _The POSTSCRIPT Drawing Utilities_ 
  306.  
  307.      Since the PS utilities take up a fair amount of space, and are not of 
  308. immediate use to someone without Adobe Illustrator and/or a POSTSCRIPT 
  309. printer, all of the above programs have been designed to work properly 
  310. even if the PS utility set is not installed. If this is your situation, 
  311. simply delete the section of the Suite3D listing starting at the comment,  
  312. @ Begin POSTSCRIPT Stuff @, before you send the file to the '48, otherwise, 
  313. read on. 
  314.  
  315. When POSTSCRIPT Output Mode is switched on (using PSTOGGLE,) all of the 
  316. plotting routines above will, in addition to their normal function,  
  317. accumulate POSTSCRIPT commands corresponding to what they were attempting 
  318. to plot on the '48 display. These are saved in a sequence of variables, 
  319. PSOUT, PSOUT&, PSOUT&&, etc. Although the output is simply ASCII text 
  320. saved as '48 character strings, it is broken up into at-most-4Kbyte 
  321. chunks so that it is easier to handle on the '48. When this text is 
  322. inserted into a "boilerplate" file (described below) the resulting 
  323. file can be sent to a POSTSCRIPT printer, or edited/viewed in the 
  324. Adobe Illustrator, or compatible, POSTSCRIPT Drawing program. 
  325.  
  326. _Descriptions of the User-intended Programs__ 
  327.  
  328. PSTOGGLE: 
  329.      When executed, this routine switches between normal (no-PS output) 
  330. and PS-output definitions of the basic graphics routines (that is, draw, 
  331. line, and tile) used in the other Suite3D programs. The new state ("PS is ON" 
  332. or "PS is OFF") is displayed on completion of the routine. 
  333.  
  334. PSRESET: 
  335.     This routine should be used to simply clear any leftover data in the 
  336. output variables PSOUT, PSOUT&, etc. making room for a new run. 
  337.  
  338. _Using the PS Capabilities_ 
  339.  
  340.   _The Boilerplate File_ 
  341.     To effectively use the PS output from the '48 you need to have a 
  342. "boilerplate" POSTSCRIPT file in which you can insert your '48 output 
  343. (it can even reside on the '48 if you have room .. in this case you 
  344. can have your '48 talk directly to a POSTSCRIPT printer ..) The 
  345. easiest way to get one is to create a new illustration in Illustrator 
  346. with no actual drawing but with the Fill set to NONE, the Line Width 
  347. set to, say, .5, and the Line Color set to 100% BLACK.  Save this as a 
  348. POSTSCRIPT (i.e. text) file HP48PS.ai or some such name. 
  349.  
  350. Open the resulting file with a text editor so you can see what it looks like. 
  351. There are two regions of interest. The first is the line near the top of the 
  352. file that looks like 
  353.  
  354. %%BoundingBox:x1 y1 x2 y2 
  355.  
  356. where x1, x2, y1, and y2 are integers. You should change these to 
  357.  
  358. %%BoundingBox:0 0 131 64 
  359.  
  360. While this is not strictly necessary, it will allow you to include the '48 
  361. produced illustration directly in a TeX document an have the size computed 
  362. correctly. 
  363.  
  364. The next region of interest is  near the end of file and begins with 
  365.  
  366. %%Note: 
  367.  
  368. and ends with 
  369.  
  370. %%Trailer 
  371.  
  372. Clear out anything between these two (this is the region where the '48 
  373. output will be inserted) and save the resulting file. This will be your 
  374. "boilerplate" file. 
  375.  
  376.   _Creating the Output_ 
  377.      This part is quite easy. After you have found a nice view with one of 
  378. the graphing utilities (with PS output turned off to speed things up) set the 
  379. RES quite high ( #13d RES [ENTER] will do nicely ) and numeric display 
  380. format quite small ( 2 FIX [ENTER] seems pretty good ) to save on room, use 
  381. PSRESET to clear the variables (if you want to get rid of a previous session) 
  382. and PSTOGGLE to activate PS mode. Now re-active the chosen plotting routine 
  383. and let it finish. 
  384.  
  385. When it is finished, transfer the contents of all the non-empty PSOUT 
  386. variables 
  387. (in ASCII mode, please) in order (PSOUT, PSOUT&, PSOUT&&, etc.) into the 
  388. region 
  389. of the boilerplate file noted above. Save the resulting file under a new name 
  390. (to preserve your boilerplate file) and you are ready to send it to a 
  391. POSTSCRIPT 
  392. printer, include it in a TeX, or muck around with it in a POSTSCRIPT drawing 
  393. program. 
  394.  
  395.   _RAM Requirements, etc._ 
  396.      The routines require very different amounts of RAM (corresponding 
  397. directly 
  398. with the output size.) A reasonable psContour results in under 4K of output 
  399. while a ShapeToShade can result in nearly 40K of output. The other routines 
  400. fall between these two (with reasonable settings for Nx, Ny, RES, and FIX.) 
  401. If desired, one could modify the PSADDTO routine (see below) to simply send  
  402. accumulated data out over one of the datacomm ports thus passing off the space 
  403. requirements to the machine at the other end of the line. 
  404.  
  405.   _What's Been Tried_ 
  406.      I've used the PS output in the form discussed above with equally good 
  407. results in Illustrator88 on a Mac IIx, direct printing to an Apple 
  408. LaserWriter, 
  409. in a Textures TeX file, and in Adobe Illustrator 1.1 under  Windows 3.0. 
  410.  
  411. POSTSCRIPT, Adobe Illustrator, and Illustrator88 are trademarks of Adobe 
  412. Systems 
  413. Corporation; 
  414. Textures is a trademark of Blue Sky Research, Inc.; 
  415. Apple LaserWriter is a trademark of Apple Computer, Inc.;  
  416. Windows is a trademark of MicroSoft Corporation; 
  417. TeX is a trademark of the American Mathematical Society. 
  418.  
  419. _Descriptions of the Utilities_ 
  420.  
  421. PSTILE: 
  422.     This utility takes a screen location (as #pixel_row #pixel_column) 
  423. followed by two unused parameters and a gray-scale value in the range [0,1], 
  424. returns these unchanged to the stack and outputs the PS code to draw a  
  425. filled-in 4x4 square at the corresponding location and with the corresponding 
  426. gray-scale fill. 
  427.  
  428. PSADDTO: 
  429.    This utility takes a string off the stack and adds it to the current 
  430. PS output variable, checking for overflow of the 4000 character limit 
  431. and starting a new output variable if the limit is exceeded. 
  432.  
  433. PSDRAW: 
  434.    Draws the current EQ (assumed to be a single expression) and outputs 
  435. a PS representation of the curve drawn as a connected sequence of Bezier 
  436. curves. It assumes that the plot type is currently FUNCTION. 
  437.  
  438. PSPARDRAW 
  439.   Draws the current EQ (assumed to be a single expression) and outputs 
  440. a PS representation of the curve drawn as a connected sequence of 
  441. Bezier curves. It assumes that the plot type is currently PARAMETRIC. 
  442.  
  443. PSLINE: 
  444.   Takes a pair of complex numbers representing the endpoints of a line, 
  445. draws the line on the screen and outputs the corresponding PS line drawing 
  446. command. 
  447.  
  448. CURRENTOUT: 
  449.   A variable containing the name of the current PS output variable  
  450. ('PSOUT', 'PSOUT&', 'PSOUT&&', etc.) 
  451.  
  452. PSCO: 
  453.   Takes a complex number and returns, as a string, the corresponding 
  454. PS coordinate value. 
  455.  
  456. PSCOPAIR: 
  457.   Takes a pair of complex numbers representing the third and fourth of 
  458. four Bezier curve control points and returns these as a string representing 
  459. the PS cross-over sequence of a Bezier curve. 
  460.  
  461. derFP 
  462.   A definition of the derivative of the FP function suitable for 
  463. supporting the PS drawing in GRIDMAP. 
  464.  
  465. derIP 
  466.   A definition of the derivative of the IP function suitable for 
  467. supporting the PS drawing in GRIDMAP. 
  468.  
  469. derIM 
  470.   A definition of the derivative of the IM function suitable for 
  471. supporting the PS drawing in GRIDMAP. 
  472.  
  473. derRE 
  474.   A definition of the derivative of the RE function suitable for 
  475. supporting the PS drawing in GRIDMAP. 
  476.  
  477.